"""
启动本地 HTTP 服务器用于 Live2D 渲染
解决浏览器跨域问题
"""

import http.server
import socketserver
import webbrowser
import os
import time
from pathlib import Path

def start_server(port=8000):
    """启动 HTTP 服务器"""
    
    # 切换到项目根目录
    project_root = Path(__file__).parent
    os.chdir(project_root)
    
    # 创建服务器
    Handler = http.server.SimpleHTTPRequestHandler
    
    # 添加 CORS 头部支持
    class CORSRequestHandler(Handler):
        def end_headers(self):
            self.send_header('Access-Control-Allow-Origin', '*')
            self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
            self.send_header('Access-Control-Allow-Headers', 'Content-Type')
            self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate')
            super().end_headers()
        
        def log_message(self, format, *args):
            # 简化日志输出,过滤模型文件请求
            # 修复: 检查 args[0] 是否为字符串,避免 HTTPStatus 对象错误
            if args and isinstance(args[0], str) and args[0].startswith('GET /models'):
                return  # 不输出模型文件请求日志
            super().log_message(format, *args)
    
    try:
        with socketserver.TCPServer(("", port), CORSRequestHandler) as httpd:
            print("=" * 70)
            print("Live2D HTTP 服务器")
            print("=" * 70)
            print(f"\n✓ 服务器已启动: http://localhost:{port}")
            print(f"✓ 工作目录: {project_root}")
            print(f"\n正在打开浏览器...")
            
            # 等待一秒后打开浏览器
            time.sleep(1)
            webbrowser.open(f"http://localhost:{port}/web_live2d_cubism4.html")
            
            print(f"\n提示:")
            print(f"  1. 浏览器应该已打开 Live2D 页面 (Cubism4专用版)")
            print(f"  2. 如果未打开，请手动访问: http://localhost:{port}/web_live2d_cubism4.html")
            print(f"  3. 确保 main.py 正在运行（提供 WebSocket 服务）")
            print(f"  4. 按 Ctrl+C 停止服务器\n")
            print("-" * 70)
            
            # 运行服务器
            httpd.serve_forever()
            
    except OSError as e:
        if e.errno == 10048:  # 端口被占用
            print(f"✗ 端口 {port} 已被占用")
            print(f"  请尝试使用其他端口，或关闭占用该端口的程序")
            return 1
        else:
            raise
    except KeyboardInterrupt:
        print("\n\n✓ 服务器已停止")
        return 0

if __name__ == "__main__":
    import sys
    sys.exit(start_server())
